home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <limits.h>
- #undef LONGBITS
- #undef BITSPERBYTE
- #undef MAXINT
- #undef MININT
- #include <dos/dos.h>
- #define DEVICES_TIMER_H
- #include <dos/dosextens.h>
- #ifdef __GNUC__
- #include <inline/exec.h>
- #include <inline/dos.h>
- #endif
- #include <stabs.h>
-
- extern void __seterrno(void);
-
- unsigned long *__stdfiledes;
- static unsigned long stdfilesize=3;
- static long stderrdes; /* The normal Amiga shell sets no process->pr_CES stream -
- * we use Open("*",MODE_NEWFILE) in this case
- */
-
- void __initstdio(void)
- { struct Process *p;
- __stdfiledes=(unsigned long *)malloc(3*sizeof(unsigned long));
- if(__stdfiledes==NULL)
- exit(20);
- p=(struct Process *)FindTask(NULL);
- __stdfiledes[STDIN_FILENO ]=Input();
- __stdfiledes[STDOUT_FILENO]=Output();
- if(!(__stdfiledes[STDERR_FILENO]=p->pr_CES))
- if(!(__stdfiledes[STDERR_FILENO]=stderrdes=Open("*",MODE_NEWFILE)))
- __stdfiledes[STDERR_FILENO]=__stdfiledes[STDOUT_FILENO];
- }
-
- /* Call our private constructor */
- ADD2INIT(__initstdio,-30);
-
- void __exitstdio(void)
- { int i;
-
- for(i=3;i<stdfilesize;i++)
- if(__stdfiledes[i])
- close(__stdfiledes[i]);
-
- if(stderrdes)
- Close(stderrdes);
- }
-
- /* Call our private destructor at cleanup */
- ADD2EXIT(__exitstdio,-30);
-
- int open(const char *path,int flags,...)
- {
- int file;
-
- for(file=0;file<stdfilesize;file++)
- if(!__stdfiledes[file])
- break;
-
- if(file>SHRT_MAX)
- return -1;
-
- if(file==stdfilesize)
- { unsigned long *tmp;
- tmp=realloc(__stdfiledes,(stdfilesize+1)*sizeof(unsigned long));
- if(tmp==NULL)
- return -1;
- __stdfiledes=tmp;
- stdfilesize++;
- }
-
- if((__stdfiledes[file]=Open((char *)path,flags&O_TRUNC?MODE_NEWFILE:
- flags&(O_WRONLY|O_RDWR)?MODE_READWRITE:MODE_OLDFILE)))
- { if(ChangeMode(CHANGE_FH,__stdfiledes[file],
- flags&(O_WRONLY|O_RDWR)?MODE_NEWFILE:MODE_OLDFILE))
- return file;
- __seterrno();
- Close(__stdfiledes[file]);
- __stdfiledes[file]=0;
- return -1;
- }
- __seterrno();
- return -1;
- }
-
- int close(int d)
- { int ret=-1;
- if(d>2)
- { ret=Close(__stdfiledes[d])?0:-1;
- __stdfiledes[d]=0; }
- return ret;
- }
-
- off_t lseek(int d,off_t offset,int whence)
- { long r;
- r=Seek(__stdfiledes[d],offset,whence==SEEK_SET?OFFSET_BEGINNING:
- whence==SEEK_END?OFFSET_END:OFFSET_CURRENT);
- if(r==EOF)
- return r;
- return Seek(__stdfiledes[d],0,OFFSET_CURRENT);
- }
-
- ssize_t read(int d,void *buf,size_t nbytes)
- { long r;
- r=Read(__stdfiledes[d],buf,nbytes);
- if(r<0)
- __seterrno();
- return r;
- }
-
- ssize_t write(int d,const void *buf,size_t nbytes)
- { long r;
- r=Write(__stdfiledes[d],(char *)buf,nbytes);
- if(r<0)
- __seterrno();
- return r;
- }
-
- int isatty(int d)
- { return IsInteractive(__stdfiledes[d]); }
-